#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <vector>

using namespace std;

// 实际执行信号处理的动作叫信号递达
// 信号从产生到递达之间的状态成为信号未决
// 被阻塞的信号产生时将保持在信号未决的状态
// 直到解除对该信号的屏蔽，才执行递达操作
//  int sigemptyset(sigset_t *set);
//  int sigfillset(sigset_t *set);
//  int sigaddset (sigset_t *set, int signo);
//  int sigdelset(sigset_t *set, int signo);
//  int sigismember(const sigset_t *set, int signo);

// int sigprocmask(int how, const sigset_t *set, sigset_t *oset);
// how:SIG_BLOCK/SIG_UNBLOCK/SIG_SETMASK

#define MAX_SIGNUM 31
vector<int> sigarr = {2};

void handler(int signo)
{
    cout<<signo<<"已经被递达！"<<endl;
}

void show_pending(const sigset_t &s)
{
    for (int signo = MAX_SIGNUM; signo >= 1; signo--)
    {
        if (sigismember(&s, signo))
            cout<<"1";
        else
            cout<<"0";
    }
    cout<<endl;
}

int main()
{
    for(const auto &sig : sigarr) signal(sig,handler);

    sigset_t block, oblock, pending;
    // sigset_t类型的数据使用前要初始化
    sigemptyset(&block);
    sigemptyset(&oblock);
    sigemptyset(&pending);

    // 添加屏蔽的信号
    for (const int &sig : sigarr)
        sigaddset(&block, sig);

    // 开始屏蔽，设置进内核
    sigprocmask(SIG_SETMASK, &block, &oblock);

    // 打印pending信号集
    cout<<"最初的block集:\n";
    show_pending(block);
    cout<<"--------------------------"<<endl;
    //show_pending(pending);

    int cnt = 10;
    while (true)
    {
        sigpending(&pending);
        show_pending(pending);
        sleep(1);
        if(cnt-- == 0)
        {
            sigprocmask(SIG_SETMASK,&oblock,&block);
            cout<<"恢复对信号的屏蔽,block位图如下:"<<endl;
            show_pending(oblock);
        }
        exit(0);
    }

    return 0;
}